package com.song.mybatis_test;

import com.song.dao.SequenceDao;
import com.song.dao.UserInfo;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import java.util.List;

/**
 * @Description: 一级缓存
 * @author: songzy
 * @Date: 2020/6/17 16:32
 */
public class FirstCacheTest {

    static SqlSessionFactory factory = MyBatisExecutorTest.factory;
    static SqlSession session = MyBatisExecutorTest.session;


    /**
     * 一级缓存命中条件 。 这里sql都不会走，区别于前面的 song-s executor
     * 1、sqlsession 相同
     * 2、sql语句相同、参数相同、
     * 3、dao对象相同、方法相同（相同的statementId == 默认是类名.方法名）
     * <p>
     * 4、rowbound 返回的范围相同 。可以没有，但是有的话，必须相同
     *
     * song-s 注意
     * 1、不能进行手动刷新   session.clearCache()
     * 2、不能进行全局设置   localcachescope = STATEMENT  ，配置文件setting 中进行属性，修改它的缓存作用域
     */

    @Test
    public void executor_simple() {
        session = factory.openSession(ExecutorType.SIMPLE, true);
        SequenceDao mapper = session.getMapper(SequenceDao.class);

        UserInfo userInfo = mapper.queryById(2);
        mapper.updateAge(1 , 2);

        //都等同于删除了缓存 ， queryById2的方法中指定了刷新缓存
//        session.clearCache();
//        mapper.queryById2(2);
//        mapper.updateName("song2_2_2" ,2); //  更新时也会进行，进源码查看 clearLocalCache();

        Object selectOne = session.selectOne("com.song.dao.SequenceDao.queryById", 2);

        System.out.println(userInfo == selectOne);
    }


}
